package net.yc.web.imalachat.push.provider;

import com.google.common.base.Strings;
import net.yc.web.imalachat.push.bean.api.base.ResponseModel;
import net.yc.web.imalachat.push.bean.db.User;
import net.yc.web.imalachat.push.factory.UserFactory;
import org.glassfish.jersey.server.ContainerRequest;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.security.Principal;

/**
 * @author: lyc
 * @data: 2022-01-01  09:12
 * @Description: 过滤器，用于所有的请求过滤和拦截
 */
@Provider
public class AuthRequestFilter implements ContainerRequestFilter {

    /**
     * 实现接口的方法
     * @param requestContext
     * @throws IOException
     */
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        // 检查是否是登录注册的接口
        String relationPath = ((ContainerRequest)requestContext).getPath(false);
        if (relationPath.startsWith("account/login") || relationPath.startsWith("account/register")) {
            // 是登录注册接口就直接返回，不做拦截操作
            return ;
        }

        // 从请求头中去找第一个token节点
        String token = requestContext.getHeaders().getFirst("token");
        if (!Strings.isNullOrEmpty(token)) {
            final User self = UserFactory.findByToken(token);
            if (self != null) {
                // 给当前请求添加一个上下文
                requestContext.setSecurityContext(new SecurityContext() {
                    // 这是主题部分
                    @Override
                    public Principal getUserPrincipal() {
                        // User实现Principal接口
                        return self;
                    }

                    @Override
                    public boolean isUserInRole(String role) {
                        // 可以在这里写入用户的权限 role是权限名
                        // 可以管理管理员权限等等
                        return true;
                    }

                    @Override
                    public boolean isSecure() {
                        // 用来检查HTTPS
                        return false;
                    }

                    @Override
                    public String getAuthenticationScheme() {
                        return null;
                    }
                });
                return;
            }
        }

        // 否则，就直接返回一个账户需要登录的model
        ResponseModel model = ResponseModel.buildAccountError();
        /**
         * 停止请求的继续下发，调用之后直接返回请求，不会走到Service
         * 在这个地方把请求中断掉
         */
        Response response = Response.status(Response.Status.OK).entity(model).build();

        requestContext.abortWith(response);

    }
}
